package com.wusiwei.mapper;

import com.wusiwei.entity.Invoice;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;

/**
 * 发票Mapper接口
 */
@Repository
@Mapper
public interface InvoiceMapper {
    /**
     * 新增发票
     *
     * @param invoice 发票对象
     */
    void insert(Invoice invoice);

    /**
     * 更新发票
     *
     * @param invoice 发票对象
     */
    void update(Invoice invoice);

    /**
     * 删除发票
     *
     * @param id 发票ID
     * @return 影响行数
     */
    int deleteById(@Param("id") Long id);

    /**
     * 根据ID查询发票
     *
     * @param id 发票ID
     * @return 发票对象
     */
    Invoice findById(Long id);

    /**
     * 根据发票号码查询发票
     *
     * @param invoiceNumber 发票号码
     * @return 发票对象
     */
    Invoice findByInvoiceNumber(@Param("invoiceNumber") String invoiceNumber);

    /**
     * 查询所有发票
     *
     * @return 发票列表
     */
    List<Invoice> findAll();

    /**
     * 根据条件查询发票
     *
     * @param invoice 查询条件
     * @return 发票列表
     */
    List<Invoice> findByCondition(Invoice invoice);

    /**
     * 分页查询发票
     *
     * @param params 分页参数
     * @return 发票列表
     */
    List<Invoice> findByPage(Map<String, Object> params);

    /**
     * 根据关键字搜索发票
     *
     * @param keyword 查询条件
     * @return 发票列表
     */
    List<Invoice> search(String keyword);

    /**
     * 根据发票类别过滤发票
     *
     * @param type 发票类别
     * @return 发票列表
     */
    List<Invoice> filter(@Param("type") String type);

    /**
     * 根据日期范围查询发票
     *
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 发票列表
     */
    List<Invoice> findByDateRange(@Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);

    /**
     * 统计发票总数
     *
     * @return 发票总数
     */
    int countTotal();

    /**
     * 统计发票总金额
     *
     * @return 发票总金额
     */
    BigDecimal sumTotalAmount();

    /**
     * 统计发票总税额
     *
     * @return 发票总税额
     */
    BigDecimal sumTotalTax();

    /**
     * 统计价税合计总额
     *
     * @return 价税合计总额
     */
    BigDecimal sumTotalAmountWithTax();

    /**
     * 统计当月发票数量
     *
     * @return 当月发票数量
     */
    int countByCurrentMonth();

    /**
     * 统计当月发票金额
     *
     * @return 当月发票金额
     */
    BigDecimal sumAmountByCurrentMonth();

    /**
     * 按类别分组统计发票数量
     *
     * @return 类别统计结果
     */
    List<Map<String, Object>> countGroupByCategory();

    /**
     * 按供应商分组统计发票数量
     *
     * @return 供应商统计结果
     */
    List<Map<String, Object>> countGroupBySupplier();

    /**
     * 按供应商分组统计发票金额
     *
     * @return 供应商金额统计结果
     */
    List<Map<String, Object>> sumAmountGroupBySupplier();

    /**
     * 按发票类别分组统计金额
     *
     * @return 类别金额统计结果
     */
    List<Map<String, Object>> sumAmountGroupByCategory();

    /**
     * 获取按金额排名前五的供应商
     *
     * @return 供应商金额TOP5
     */
    List<Map<String, Object>> getTop5SuppliersByAmount();

    /**
     * 获取按数量排名前五的供应商
     *
     * @return 供应商数量TOP5
     */
    List<Map<String, Object>> getTop5SuppliersByCount();

    /**
     * 获取指定年份的月度趋势
     *
     * @param year 年份
     * @return 月度趋势数据
     */
    List<Map<String, Object>> getMonthlyTrendByYear(@Param("year") Integer year);

//    /**
     //     * 根据状态统计发票数量
     //     *
     //     * @param status 发票状态
     //     * @return 发票数量
     //     */
//    int countByStatus(String status);

//    /**
//     * 按类别统计发票数量
//     *
//     * @return 类别统计结果
//     */
//    Map<String, Long> countByCategory();

//    /**
     //     * 按日期范围统计发票数量
     //     *
     //     * @param startDate 开始日期
     //     * @param endDate   结束日期
     //     * @return 日期统计结果
     //     */
//    Map<String, Long> countByDateRange(LocalDate startDate, LocalDate endDate);

    /**
     * 按状态分组统计发票数量
     *
     * @return 状态统计结果
     */
    List<Map<String, Object>> countGroupByStatus();

//    /**
//     * 按月统计发票金额
//     *
//     * @param startDate 开始日期
//     * @param endDate   结束日期
//     * @return 统计结果
//     */
//    List<Map<String, Object>> sumAmountGroupByMonth(@Param("startDate") LocalDate startDate,
//                                                    @Param("endDate") LocalDate endDate);

    /**
     * 查询未匹配的发票列表
     *
     * @param limit 限制返回数量，默认为100
     * @return 未匹配的发票列表
     */
    List<Invoice> findUnmatchedInvoices(@Param("limit") Integer limit);

    /**
     * 根据订单ID获取关联的发票列表
     *
     * @param orderId 订单ID
     * @return 发票列表
     */
    List<Invoice> getInvoicesByOrderId(Long orderId);

    /**
     * 批量删除发票
     *
     * @param ids 发票ID列表
     * @return 影响行数
     */
    int batchDelete(@Param("ids") List<Long> ids);
} 